/**
 * @Author: yuanmanxue <yuanmanxue>
 * @Date:   2017-12-12 04:49:14
 * @Last modified by:   yuanmanxue
 * @Last modified time: 2017-12-13 02:35:59
 */

function Vue (options) {
    var self = this;
    this.data = options.data;
    this.methods = options.methods;
    // 方法会返回一个由一个给定对象的自身可枚举属性组成的数组，数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致
    console.log(this.data.title);
    Object.keys(this.data).forEach(function (key) {
      // 在vue实例vm是可以对data进行操作的  实际上就是进行代理的过程
        self.proxyKeys(key);
    });
    console.log(this.title);
    // observe实现对data一个监听的过程
    observe(this.data);
    // 代码编译的一个过程  什么时候手动调用一下watcher
    new Compile(options.el, this);
    options.mounted.call(this); // 所有事情处理好后执行mounted函数
}

Vue.prototype = {
    proxyKeys: function (key) {
        var self = this;// vm实例
        // 直接在一个对象上面定义一个新的属性，或者修改这个属性并且返回这个对象
        Object.defineProperty(this, key, {
            enumerable: false, // 不能枚举
            configurable: true,// 描述符可以被修改并且该属性可以被删除
            get: function () {
                return self.data[key];
            },
            set: function (newVal) {
                self.data[key] = newVal;
            },
        });
    },
};
